package com.zdp.leetcodeMiddle;
import com.zdp.util.ListNode;
/*
* 题目描述：
* 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
请你将两个数相加，并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
* */
public class 两数相加_2 {
    public static void main(String[] args) {
        ListNode l1 = ListNode.createListNode(2,4,3);
        ListNode l2 = ListNode.createListNode(5,6,4);
        两数相加_2 demo = new 两数相加_2();
        demo.addTwoNumbers(l1,l2);
    }
    /*
    * ListNode 为单向链表,
    * 但是它数字存储的方式是逆序的，所以我们就遍历两个链表，然后相同的位数进行相加即可，记录进位
    * 要注意 99 + 9 这种情况，最后得到的数是三位数 要记得进行处理一下
    * 处理一下  99+99  99+999 999+99 即可
    * */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode p1 = l1;
        ListNode p2 = l2;
        ListNode prep1 = null;
        ListNode prep2 = null;
        // p2 p1 一起来
        int jinwei = 0;
        while(p1!=null&&p2!=null){
            int temp = p1.val + p2.val+jinwei;
            jinwei = temp>=10? 1 : 0;
            temp = temp%10;
            p1.val = p2.val = temp;
            prep1 = p1;
            prep2 = p2;
            p1 = p1.next;
            p2 = p2.next;
        }
        // 看谁先到头
        if(p1==null){
           while(p2!=null){
               int temp = p2.val +jinwei;
               jinwei = temp>=10? 1 : 0;
               temp = temp%10;
               p2.val = temp;
               prep2 = p2;
               p2 = p2.next;
           }
            if(jinwei>0){
                ListNode tt = new ListNode(jinwei);
                tt.next = prep2.next;
                prep2.next = tt;
            }
           return l2;
        }else{
            while(p1!=null){
                int temp = p1.val +jinwei;
                jinwei = temp>=10? 1 : 0;
                temp = temp%10;
                p1.val = temp;
                prep1 = p1;
                p1 = p1.next;
            }
            if(jinwei>0){
                ListNode tt = new ListNode(jinwei);
                tt.next = prep1.next;
                prep1.next = tt;
            }
            return l1;
        }
    }
}
